package day9;

//synchronized 实现多线程购买商品
//两个线程 都想去购买100个商品
//商品总数只有100个
//而且两个线程必须轮流购买

//锁对象.wait() 当线程等待，需要别人唤醒，释放对象锁
//锁对象.notify()  唤醒随机一个
//锁对象.notifyAll()  唤醒全部
public class Demo4 {
    int sum = 100;

    public synchronized void buy() {
        String name = Thread.currentThread().getName();
        if (sum > 0) {
            sum--;
            System.out.println(name + "购买了商品,剩余:" + sum + "个");
        }
        try {
            this.notifyAll(); //唤醒全部的
            this.wait();  //等待 ，释放锁
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        Demo4 d = new Demo4();

        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                d.buy();
            }
        }, "邓志涛").start();

        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                synchronized (d) {
                    String name = Thread.currentThread().getName();
                    if (d.sum > 0) {
                        d.sum--;
                        System.out.println(name + "购买了商品,剩余:" + d.sum + "个");
                    }
                    try {
                        d.notifyAll(); //唤醒全部的
                        d.wait();  //等待 ，释放锁
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }, "陶松").start();

    }
}
